package com.nolon.flange.tools

import java.text.SimpleDateFormat
import java.util.*

object FriendlyDateUtil {
    /**
     * 获取友好时间
     *
     * @param date 时间
     * @param isAf 是否显示将来时间
     */
    fun getFriendlyTime(date: Date?, isAf: Boolean): String {
        if (date == null) {
            return ""
        }
        var dateFormat: SimpleDateFormat
        val ct = ((System.currentTimeMillis() - date.time) / 1000).toInt()
        if (isAf) {
            if (ct < 0) {
                if (ct < -86400) { //86400 * 30
                    val day = ct / -86400
                    if (day == 1) {
                        return "后天 " + SimpleDateFormat("HH:mm").format(date)
                    }
                    dateFormat = if (date.year == Date().year) {
                        SimpleDateFormat("MM-dd HH:mm")
                    } else {
                        SimpleDateFormat("yyyy-MM-dd HH:mm")
                    }
                    return dateFormat.format(date)
                }
                if (!isSameDate(Date(), date)) { //判断跨天
                    return "明天 " + SimpleDateFormat("HH:mm").format(date)
                }
                if (-86400 < ct && ct < -3600) {
                    return String.format(
                        "%d小时后 %s",
                        ct / -3600,
                        SimpleDateFormat("HH:mm").format(date)
                    )
                }
                if (-3600 < ct && ct < -61) {
                    return String.format(
                        "%d分钟后 %s",
                        Math.max(ct / -60, 3),
                        SimpleDateFormat("HH:mm").format(date)
                    )
                }
                if (-61 < ct && ct < 0) {
                    return String.format("即将到点 %s", SimpleDateFormat("HH:mm").format(date))
                }
            }
        }
        if (ct < 61) { //1分钟内
            return "刚刚"
        }
        dateFormat = SimpleDateFormat("HH:mm")
        if (isSameDate(Date(), date)) { //
            if (ct < 3600) { //1小时内
                return String.format("%d分钟前", Math.max(ct / 60, 3))
            }
            if (ct >= 3600 && ct < 86400) { //当天超过一小时显示
                return dateFormat.format(date)
            }
        } else {

//不是当天时进入
            if (ct < 86400) {
                return "昨天 " + dateFormat.format(date)
            }
            if (ct >= 86400 && ct < 259200) { //86400 * 3 (三天)
                var day = ct / 86400
                if (!isSameDate(addDay(Date(), -day), date)) { //判断时间匹配日期
                    day = day + 1
                }
                return if (day == 1) {
                    "昨天 " + dateFormat.format(date)
                } else {
                    dateFormat = SimpleDateFormat("MM-dd HH:mm")
                    dateFormat.format(date)
                }
            }
        }
        dateFormat = if (date.year == Date().year) {
            SimpleDateFormat("MM-dd HH:mm")
        } else {
            SimpleDateFormat("yyyy-MM-dd HH:mm")
        }
        return dateFormat.format(date)
    }

    /**
     * 是否两个时间是否为同一天
     *
     * @param date1,date2 两个对比时间
     */
    private fun isSameDate(date1: Date, date2: Date): Boolean {
        val cal1 = Calendar.getInstance()
        cal1.time = date1
        val cal2 = Calendar.getInstance()
        cal2.time = date2
        val isSameYear = cal1[Calendar.YEAR] == cal2[Calendar.YEAR]
        val isSameMonth = (isSameYear
                && cal1[Calendar.MONTH] == cal2[Calendar.MONTH])
        return (isSameMonth
                && cal1[Calendar.DAY_OF_MONTH] == cal2[Calendar.DAY_OF_MONTH])
    }

    /**
     * 天数增加
     *
     * @param date 时间
     * @param day  增加天数 可为负整数、正整数
     * 例如-1 相当于减少一天
     * 1 相当于增加一天
     */
    fun addDay(date: Date?, day: Int): Date {
        val calendar = Calendar.getInstance()
        calendar.time = date
        calendar[Calendar.DATE] = calendar[Calendar.DATE] + day
        return calendar.time
    }

    /**
     * 月数增加
     *
     * @param date  时间
     * @param month 增加月数 可为负整数、正整数
     * 例如-1 相当于减少一月
     * 1 相当于增加一月
     */
    fun addMonth(date: Date?, month: Int): Date {
        val calendar = Calendar.getInstance()
        calendar.time = date
        calendar.add(Calendar.MONTH, month)
        return calendar.time
    }

    /**
     * 年数增加
     * * @param date 时间
     * * @param year 增加年数 可为负整数、正整数
     * 例如-1 相当于减少一年
     * 1 相当于增加一年
     */
    fun addYear(date: Date?, year: Int): Date {
        val calendar = Calendar.getInstance()
        calendar.time = date
        calendar.add(Calendar.YEAR, year)
        return calendar.time
    }
}